using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#region setting
	//设置游戏启动时是否有弹窗选择分辨率
	//File -> Build Setting -> Player Setting -> Resolution and Presentation -> 
		//Default is Full Screen =>false
		//	Display Resolution Dialog => false

#endregion

#region 资源管理中常用的文件夹名称
	Textures //贴图
	Materials //材质球
	Scripts	//脚本
	Scenes	//场景
	Prefabs //预制体
	Audios //音频文件
	Resources //资源（可以在代码中动态的从这个文件夹里加载资源）
	StreamingAssets //打包的时候里面的资源会被原封不动的打包进安装包里
#endregion

#region 杂项
	bool 组件.enabled;//组件是否启用
	//随机数
	int System.Random.Nect(int min,int max);//C#提供的随机数
	static int/float UnityEngine.Random.Rang(int/float min,int/float max);//Unity提供的随机数
	
	void GameObject.SetActive(bool);//设置是否激活
	bool GameObject.activeSelf{get;}//获取该游戏物体的激活状态，如果为true不一定激活，还要看其父辈祖辈的激活状态
	bool GameObject.activeHierarchy{get;}//获取祖父辈和他自己的激活状态，祖父辈全部为true时返回true，此时其值与实际的激活状态相同

#endregion

#region 输入
	enum KeyCode{};
	KeyCode.Return;//回车

	static bool Input.GetKey();
	static bool Input.GetKeyDown();
	static bool Input.GetKeyUp();
	
	static bool Input.GetMouseButton(int);//0左键 1右键 2中键
	static bool Input.GetMouseButtonDown();
	static bool Input.GetMouseButtonUp();
	static Vector3 Input.mousePosition{get;}//z轴为0，屏幕左下角为原点，最大值为屏幕分辨率最大值，存在小数
	
	static float Input.GetAxis(string);
	/*
		参数如下：
		"Horizontal"		水平轴
		"Vertical"			垂直轴
		"Mouse ScrollWheel"	鼠标滚轮
	 */
#endregion
	
#region 组件操作
	T GameObject.GetComponent<T>();
	void GameObject.AddComponent<T>();
	
#endregion

#region 移动
	void Transform.Translate(Vector3,Space);
	
	void Rigidbobly.MovePosition(Vector3);
	
	void Rigidbobly.AddForce(Vector3,ForceMode);//添加力，世界坐标
	
	void Rigidbobly.AddRelativeForce(Vector3);//添加相对力，自然坐标
	
	void Rigidbobly.AddExplosionForce(float explosionForce ,Vector3 explosionPosition ,float explosionRadius ,float upwardsModifier ,ForceMode mode);//添加爆炸力，模拟爆炸。

	void Rigidbobly.velocity{get;se;};//设置该时刻物体的速度

	CollisionFlags CharacterController.Move(Vector3);//依赖于CharacterController组件的移动
#endregion

#region 旋转操作
	void Transform.Rotate(Vector3,float);
	void Transform.Rotate(Vector3);
	void Transform.LookAt(Vector3);

	void Rigidbobly.AddTorque(Vector3 v3);//添加一个力矩，力矩方向为v3的反方向
#endregion

#region 事件
	void Awake();
	void OnEnable();//脚本被激活时调用
	void Start();
	
	void FixedUpdate();//受Time.timeScale 影响
	void Update();
	void LateUpdate();
	
	void OnCollisionEnter(Collision);
	void OnCollisionExit(Collision);
	void OnCollisionStay(Collision);
	
	void OnTriggerEnter(Collider);
	void OnTriggerExit(Collider);
	void OnTriggerStay(Collider);
	
	void OnMouseEnter();
	void OnMouseExit();
	void OnMouseDown();
	
	void OnGUI();
	void OnValidate();//当脚本被加载或者属性面板被修改的时候，会自动调用这个方法，包括编辑器模式的时候。可以用它来验证属性值是否有效
	
	void OnDisable();
	void OnDestroy();

	void OnRenderImage(RenderTexture source, RenderTexture destination);//当相机渲染完场景之后，屏幕输出之前调用。传入渲染后的图片，第二个参数用来存储本回调处理过后的图片
																		//如果 destination 为null，则图片直接被渲染在屏幕上
#endregion

#region 获取父子物体
	static gameObject GameObject.Find(string name);
	static gameObject GameObject.FindGameObjectWithTag(string tag);
	static gameObject[] GameObject.FindGameObjectsWithTag(string tag);
	Transform Transform.Find(string name);
	Transform Transform.FindChid(string name);//name可用“第一层子物体/第二层子物体”

#endregion

#region 
	new GameObject();//创建一个空游戏物体
	static T Resounces.Load<T>(string name);//从Resounces文件夹中加载资源
	static Object GameObject.Instantiate(Object,Vector3,Quaternion);//把加载好的资源添加到场景中去,返回值和参数值的对象是不同的东西
	static void GameObject.Destrey(UnityEngine.Object Obj,float time);//在测试模式下，一定时间之后删除物体
	static void GameObject.DestroyImmediate(UnityEngine.Object);//在编辑模式下删除物体，Editor中使用，不可撤销，如果希望可撤销，查阅本文档Undo类
	GameObject();
#endregion

#region 向量/矩阵
	Vector3 Transform.up;//返回物体自然坐标的上方
	float   Vector3.magnitude;//返回向量的模长
	float   Vector3.sqrMagnitude;//返回模的平方
	Vector3 Vector3.normalized;//返回单位向量
	
	void   Vector3.Normalize();
	static vector3 	Vector3.Normalize		(vector3);
	static Vector3 	Vector3.Cross			(Vector3 v1,Vector3 v2);//叉积 v1×v2
	static Vector3 	Vector3.Dot				(Vector3 v1,Vector3 v2);//点积 v1·v2
	static float 	Vector3.Distance		(Vector3 v1,Vector3 v2);//v1-v2的模长,即两个点的距离
	static Vector3	Vector3.Lerp			(Vector3 v1,Vector3 v2,float t);//线性插值 只插值向量的模。返回向量的末端永远在起点和终点所在的直线上
	static Vector3 	Vector3.Slerp			(Vector3 from,vector3 to,float t);//沿着某圆以插值方式移动至目标 (球面插值)。插值向量的模和于目标向量的角度
	static Vector3	Vector3.Scale			(Vector3 a,Vector3 b);//输入 (1,2,3)(2,3,4) 输出 (2,6,12) 逐分量相乘
	static Vector3	Vector3.ClampMagnitude	(Vector3,float maxLenth);//返回向量的拷贝，其模不超过maxLenth
	static float 	Vector3.Angle			(Vector3 from,Vector3 to);//获得夹角，如果to是零向量，则返回90.  |arcsin((n·v)/(|n||v|))|
	static Vector3 	Vector3.RotateTowards	(vector3 current,vector3 target,float maxRotateDelta,float maxMagnitudeDelta);//沿着某圆以匀速移动至目标
	static void 	Vector3.OrthoNormalize	(ref Vector3 normal,ref Vector3 tangent);
	static void 	Vector3.OrthoNormalize	(ref Vector3 normal,ref Vector3 tangent,ref Vector3 binormal);//normal为输入向量，tangent切线，binormal法线
	static Vector3 	Vector3.Project			(Vector3 v1,Vector3 v2);//返回v1在v2上的投影向量
	static Vector3 	Vector3.ProjectOnPlan	(Vector3 v1,Vector3 planV1);//返回v1在以planV2为法线的平面上的投影
	static Vector3 	Vector3.Reflect			(Vector3 v1,Vector3 planV1);//返回v1在以planV2为法线的平面上镜面反射得到的向量

	float Matrix4x4.m00;//矩阵 00 号元素
	Matrix4x4 Transform.localToWorldMatrix;
	Matrix4x4 Transform.worldToLocalMatrix;
	Vector3 MultiplyPoint(Vector3 point);	//左乘一个点坐标
	Vector3 MultiplyVector(Vector3 vector);	//左乘一个向量
	void SetTRS(Vector3 pos, Quaternion q, Vector3 s);	//设置位移、旋转和缩放
#endregion

#region 四元数
	static Quaternion Quaternion.Euler(Vector3);//把向量表示的旋转转化为四元数
#endregion

#region 自动执行的事件
	void Invoke(string,float);
	void InvokeRepeating(string,float,float);
	void CancelInvoke();
#endregion

#region 物体间通信
	void gameObject.SendMessage(string);//通知该物体身上的某个方法执行
	void gameObject.SendMessageUpwards(string);//通知父级的某个方法执行
#endregion

#region 工具类
	static Screen.width //屏幕信息 
				 .height
	static float Time.time //
					 .deltaTime
					 .timeScale //控制时间缩放
	static Mathf.Abs();
				.Max();
				.Min();
				.Round();
				.Lerp(float a,float b,float t);//插值运算
#endregion

#region 物体检测相关
	static Camera Camera.main{get;set;};//获取标签为main的相机的引用
	Ray Camera.ScreenPointToRay(Vector3)//转化屏幕终点为射线
	struct Ray;
	struct RaycastHit{};
	static bool Physics.Raycast(Ray, out RaycastHit);//检测是否发生碰撞，并返回碰撞信息到RaycaseHit中去
	static void Debug.DrawRay(Vector3 star,Vector3 dir,Color);//在编辑窗口绘制射线

	static Collider[] Physics.OverlapSphere(Vector3 position,float radius,int layerMash);//返回半径之内(包括半径)所有物体的碰撞器
	
#endregion

#region NGUI
	UIAtlas UISprite.atlas{get;set;}//图集
	string UISprite.spriteName{get;set;}//贴图名称
	static void NGUITools.AddChild(GameObject parent,GameObject prefab);

	void OnClick();
	void OnHover();//鼠标进入和离开都会触发这个事件
	
	Typewriter Effect //打字机效果，只会显示一次，
	UISlider/NGUISlider
		this.value=UIProgressBar.current.walue;
	Tween动画
		void TweenPosition.PlayForward();
		void TweenPosition.PlayReverse();
		void TweenPosition.ResetToBeginning();
	UIPopupList/Popup List
		void UIPopupList.Show();//打开下拉菜单
	UIToggle/Toggle
	UIInput/Input Field
		bool UIInput.isSelected;//为true时开始输入
		string UIInput.value;//当前的输入值
	Drag Object
	UIDrag Resize/Drag Resize Widget
	UIScroll Bar/NGUI Scroll Bar
	UIText List/Text List
	Drag and Drop Item
		OnDragDropStart(GameObject surface);
		OnDragDropMove(GameObject surface);
		OnDragDropRelease(GameObject surface);
	
	static UIEventListener.Get(GameObject).onPress;//go上要有BoxCollider
	private void Method(GameObject go,bool isPress){}//赋值给上一行所示回调的方法签名
#endregion

#region	UGUI
	using UnityEngine.UI;

	Shadow;//组件，配合Text组件使用，给文字添加阴影
	Outlien;//组件，配合Text组件使用，给文字添加外边框

	ToggleGroup;//组件，配合Toggle组件使用，Group属性赋予同一个ToggleGroup的Toggle对象为同一组
				//控制面板切换，通过往Toggle的OnValueChange()注册事件来改变页面的Active
		void Function(bool isOn);//Toggle的OnValueChaneg事件的结构
	#region Grid Layout Group组件
		//对子物体进行自动排列
		CallSize;//每一个子物体的大小
	#endregion

	//拖拽
	//实现两个接口：IBeginDragHandler,IEndDragHandler,包含一个在拖拽开始的时候的事件和一个拖拽结束的时候的事件
	using UnityEngine.EventSystems;
	Vector3 ScrollRect.normalizedPosition{get;set;}//拖拽到哪里,无动画
	float ScrollRect.horizontalNormalizedPosition{get;set;}
	float ScrollRect.VerticalNormalizedPosition{get;set;}

	void Button.OnSelect();//选择这个按钮

	Vector2 RectTransform.sizeDelta;//UI的宽高
	Vector2 RectTransform.anchoredPosition;//相对锚点的位置
	Vector3 RectTransform.position;//屏幕坐标，左下角为原点，无视父子关系，数值和 Input.mousePosition 是一样的
	Vector3 RectTransform.localPosition;//相对于父物体中心点的位置

	void RectTransform.SetAsFirstSibling();//移动到所有兄弟节点的第一个位置（Hierarchy同级最上面，先渲染，显示在最下面）
	void RectTransform.SetAsLastSibling();//移动到所有兄弟节点的最后一个位置（Hierarchy同级最下面，后渲染，显示在最上面）
	int RectTransform.GetSiblingIndex();//获得该元素在当前兄弟节点层级的位置
	void RectTransform.SetSiblingIndex();//设置该元素在当前兄弟节点层级的位置

	Button.onClick = ()=>{}

	//富文本
	<b>粗体</b>
	<i>斜体</i>
	<size=50>字体大小</size>
	<color=red>颜色，也可用16进制</color>
	<material>材质
	<quad>嵌入
#endregion



#region 协同程序 协程
	IEnumerator XXX()
	{
		//...
		yield return new WaitForSeconds (0.5f);//yield return break跳出携程
		//...
	}
	void StopCoroutine(string);
	void StartCoroutine(string);
#endregion

#region Transform
	void Transform.DetachChildren();
	void Transform.SetParent(Transform father);
#endregion

#region PlayerPrefs 注册表，永久存储数据.游戏模式时使用
	static int PlayerPrefs.GetInt(string key,int n);//n为默认值
	static float PlayerPrefs.GetFloat(string key,float n);
	static string PlayerPrefs.GetString(string key,string n);
	
	static int PlayerPrefs.SetInt(string key,int val);
	static float PlayerPrefs.SetFloat(string key,float val);
	static string PlayerPrefs.SetString(string key,string val);
#endregion

#region EditorPrefs 永久数据，编辑器模式下使用
	static int EditorPrefs.GetInt(string key,int n);//n为默认值
	static int EditorPrefs.GetBool(string key,int n);
	static float EditorPrefs.GetFloat(string key,float n);
	static string EditorPrefs.GetString(string key,string n);

	static int EditorPrefs.SetInt(string key,int val);
	static int EditorPrefs.SetBool(string key,int val);
	static float EditorPrefs.SetFloat(string key,float val);
	static string EditorPrefs.SetString(string key,string val);
#endregion


#region XML
	//Windows平台的路径要求
	//安卓平台路径要求
	private string xmlPath = Application.dataPath + path;//path是打包好之后，游戏名字_Data 下的路径，打包之后还要把xml文件放 游戏名字_Data 文件夹下
	//<1>静态文件（只读）
	//	把文件放到Resources文件夹下
	//	用 
			string Resources.Load(string name).ToString();
	//	获得xml文本
	//	用 
			void XmlDOcument.LoadXml(string xmlText);
	//	解析上一步获得的xml格式的字符串
	//<2>动态文件（读写）
	//	文件被应该被放在
		string Application.persistentDataPath;
	//	下
#endregion

#region JSON
	using UnityEngine;
	//把 json 文本转化为与之格式相对应的类。注意，类中字段名要与文本中的键名相同
		/*
			{
				"name": "testJson",
				"speaks": {
					"name": "dsv",
      				"version": "1"
				}
			}
			[Serializable]
			public class TestObject
			{
				public string name;		此处对应于文本中的 name
				public string[] speaks;	此处对应于文本中的 speaks
			}
			[Serializable]	这里一定要加这个特性
			public class TestObject2
			{
				public string name;
				public int version;
			}
		 */
	static T JsonUtility.FormJson<T>(string jsonText);
	static T JsonUtility.FormJson(string jsonText,Type type) as T;
		testObj = JsonUtility.FromJson(testJson, typeof(TestObject)) as TestObject;
	static string JsonUtility.ToJson(Object);	//把对象转化为 json 文本

#endregion

#region 场景间转换
	using UnityEngine.SceneManagement;
	static void SceneManager.LoadScene(int index);
#endregion

#region CharacterController人物控制器组件
	void OnControllerColliderHit(ControllerColliderHit hit);
#endregion

#region 动画状态机转换
	int Animator.StringToHash(string str);	//把 Animator 中字符串转换为这个参数的id，可以在 SetFloat() 等中使用
											//这里的字符串可以是状态名，也可以是变量名。状态名格式： 层.状态名  变量名格式 变量名
	void Animator.SetFloat(string name,float value);
	void Animator.SetFloat(int id,float value);
	void Animator.SetTrigger(string name);
	bool Animator.IsInTransition(int layerIndex);//某动画层是否处于转换状态的期间
	AnimatorStateInfo Animator.GetCurrentAnimatorStateInfo(int layerIndex);//某层当前动画的状态信息
	bool AnimatorStateInfo.IsName(string name);//参数是否是当前状态机的状态名称
	//匹配目标位置，可以从 startNormalizedTime 开始插值，使得 targetBodyPart 所代表的身体部位位于 matchPosition
	void MatchTarget(Vector3 matchPosition, //目标位置
		Quaternion matchRotation, //旋转
		AvatarTarget targetBodyPart, //被匹配的身体部位
		MatchTargetWeightMask weightMask, //权重，其构造方法里传入 位置的权重和旋转的权重，0为完全无视，1为完全一致
		float startNormalizedTime, //开始插值时间，需要把这一帧的编号除以总帧数，也就是归一化
		float targetNormalizedTime);//匹配结束时间，同上。默认为1，也就是动画结束的时候匹配结束
	void Animator.SetLayerWeight(int layer,float weight);//设置某层的权重
	//混合树
	/*
		类型：
			1D: 只由一个参数控制混合
			2D Simple Directional: 多个动画都是有不同方向的
			2D Freeform Directional: 在 上一个的基础上，可以有多个动画方向一致。同时要保证有一个动画在(0,0)位置
			2D Freeform Cartesian: 同一方向上，两个参数代表不同类型，比如前进速度和转向角度
	*/

	//IK动画
	/*
		需要在 Animator 面板左边某层的设置栏里面勾选 IK Pass
	*/
	void OnAnimatorIK(int layerIndex){}//事件，和Update一个东西，由Unity调用，每帧调用，每个IK层都会被调用一次
	void Animator.SetIKPosition(AvatarIKGoal ikGoal,Vector3 goalPosition);//让第一个参数所指代的骨骼部分移动到第二个参数的位置
	void Animator.SetIKRotation(AvatarIKGoal ikGoal,Vector3 rotate);//设置IK的旋转
	void Animator.SetIKPositionWeight(AvatarIKGoal ikGoal,float weight);//设置IK权重，[0,1]
	void Animator.SetIKRotationWeight(AvatarIKGoal ikGoal,float weight);

	/*
		using UnityEngine.Playables;
		TimeLine
			Animation Track 动画
			Active Track	控制物体的激活状态
			Audio Track 	控制声音播放
			Control Track
	*/
	void PlayableDirector.Play();//播放 TimeLine
#endregion

#region 音频
	static void AudioSources.PlayClipAtPoint(AudioClip,vector3);
#endregion

#region 事件委托EvenDelegate(NGUI)
	EvenDelegate;
	public EvenDelegate(MonoBehaviour target,string methodName);//target为有要回调的方法的类（必须继承于MonoBehaviour），methodName为要回调的方法名
	public void EvenDelegate.Add(EvenDelegate item);//给已有的事件委托添加新事件委托。一般是给onClick等添加自己定义的事件委托
	public void EvenDelegate.Execute();//执行回调
#endregion

#region 2D材质相关
	/*摘要：精灵接受灯光
		一般精灵体是不接受灯光的，但是我们可以这么做，使他收到灯光影响
		把精灵放到场景当中
		创建材质球，Shader选择Sprite/Diffuse
		把材质球给精灵
		这样就可以接受灯光了。
		F:\Unity3D资源\笔记配图\精灵接受灯光.png
	 */

	
#endregion

#region 扩展编辑器
	using UnityEditor;
	//相关类文件都放在Editor目录下
	[MenuItem("Tools/Message")]//该特性修饰静态方法，在菜单栏上创建一栏“Tools”并添加Message按钮，单击按钮执行被修饰的方法
							   //方法访问修饰符随意
	[MenuItem(string menuName,bool isValidateFunction,int priority)]//目录名称，是否是验证方法，优先级。
																	//名称，目录结构。之后加一个空格，然后写快捷键(可不写)，如"Tools/Message &t"
																	//%：ctrl #：shift &：alt _：不用ctrl，shift或alt，只需要字母    _t：快捷键t，%t：快捷键ctrl+t
																	//isValidateFunction 是否是验证方法。只有验证方法返回true 的时候才会执行与验证方法在同一按钮的方法(下称执行方法)。
																	//执行方法与验证方法，修饰的特性除了isValidateFunction以外完全一样
																	//优先级控制菜单的显示顺序，每一个菜单栏的优先级默认为1000，相邻两个菜单的优先级超过11，那么就是对他们做了一个分类(生殖隔离)
																	//menuName中写入"CONTEXT/脚本名字/按钮名字"为在物体上的相应脚本组件右击弹窗添加按钮（Edit Script 按钮优先级为600）被修饰静态方法可以有一个参数，类型为MenuCommand获取当前操作的组件

	#region 可编程弹窗 ScriptableWizard : EditorWindow
		//<1>创建一个类,继承ScriptableWizard
		using UnityEditor;

		static T ScriptableWizard.DisplayWizard<T>(string title,string changeButtenName,string otherButtenName);//创建类型为T的对话框，T为继承ScriptableWizard类的子类
														//一般创建对话框的代码和对话框本身放在同一个类里面
		private void OnWizardCreate();//事件，当DisplayWizard()方法第二个参数所对应的按钮被点击时触发，点击后执行事件并关闭对话框
		private void OnWizardOtherButton();//事件，当DisplayWizard()方法第三个参数所对应的按钮被点击时触发，点击后执行事件但不关闭对话框
		private void OnWizardUpdate();//事件，当对话框中变量值等发生改变的时候触发
		private void OnInspetcionUpdate();//事件，对话框被调出之后，每秒被调用10次
		private void OnSelectionChange();//当选择的对象发生改变的时候调用
		private void ShowNotification(GUIContent);//显示提示信息

		string ScriptableWizard.errorString;//错误信息
		string ScriptableWizard.helpString;//帮助信息
	#endregion

	#region 窗口 EditorWindow : ScriptableObject
		//<1>创建一个继承于 UnityEditor.EditorWindow 的类 如类 MyWindows
		static T EditorWindow.GetWindow<T>();//获取并显示一个窗口 。单例的，重复打开只会打开一个窗口
		static T ScriptableObject.CreateInstance<T>() where T : ScriptableObject;//获取一个窗口对象
		void MyWindows.Show();//把这个窗口对象显示出来，为可停靠的窗口。可打开多个窗口
		void MyWindows.ShowUtility();//显示窗口，浮动的，不可停靠。只有系统焦点在 Unity 上的时候才显示
		void MyWindows.ShowPopup();//显示弹窗。注意这个弹窗没有关闭按钮，只是显示一块区域给你，按钮需要你自己去画。具体如下
			public void OnGUI(){ if(GUILayout.Button("Close"))this.Close(); }
		void MyWindows.Close();
		static void GUILayout.Label(string);//显示一个文本
		static string GUILayout.TextField(string);//显示一个输入框，传入输入框上显示的文字，返回输入的文字
		static bool GUILayout.Button(string);//创建一个按钮，传入按钮上显示的文字.被点击的时候返回true
		private void ShowNotification(GUIContent);//显示提示信息  参数可填 new GUIContent("提示信息");

		protected Vector2 EditorWIndow.minSize;

		//事件
		private void OnGUI();
		private void Updata();
		private void OnInspectorUpdata();//对话框被调出之后，每秒被调用10次
		private void OnDestroy();
		private void OnSelectionChange();//当选择的对象发生改变的时候调用
		private void OnHierarchyChange();//当 Hierarchy 面板组件发生改变的时候（增删）
		private void OnPrgjectChange();//当 Project 面板发生改变的时候（增删改）
		private void OnFocus();//获取到焦点的时候
		private void OnLostFocus();
	#endregion

	##region GUILayoutUtility
		static Rect GUILayoutUtility.GetRect(float width,float height);//返回一个设置好的矩形框。多达9个重载方法。

	#endregion

	##region EditorGUI
		static void EditorGUI.ProgressBar(Rect position,float value,striing text);//绘制进度条
		
	#endregion

	#region EditorGUILayout 绘制控件
		//标签
		static void    	EditorGUILayout.LabelField(string);
		static void    	EditorGUILayout.SelectableLabel(string);//标签内容支持选择，支持多行(\n)
		static void    	EditorGUILayout.Space();//空行

		//输入框
		static string  	EditorGUILayout.TextField(string);//单行输入框
		static string  	EditorGUILayout.TextArea(string);//多行输入框
		static string  	EditorGUILayout.PasswordField(string);//密码输入框

		static Color   	EditorGUILayout.ColorField(Color);

		static int     	EditorGUILayout.IntField(int);//整数输入框
		static float   	EditorGUILayout.FloatField(float);//浮点数输入框
		static double  	EditorGUILayout.DoubleField(double);

		static Vector2 	EditorGUILayout.Vector2Field(string label,Vector2 value);//二维向量输入框
		static Vector3 	EditorGUILayout.Vector3Field(string label,Vector3 value);//三维向量输入框
		static Vector4 	EditorGUILayout.Vector4Field(string label,Vector4 value);//四维向量输入框
		static Rect    	EditorGUILayout.RectField(string label,Rect value);//二维矩阵输入框，可不加 label
		static Bounds  	EditorGUILayout.BoundsField(string label,Bounds value);//边距输入框, 可不加 label

		static AnimationCurve EditorGUILayout.CurveField(string label,AnimationCurve value);//动画片段（就是 TweenPosition 组件里面的那个函数图象） label 可不加

		//滑动条
		static float   	EditorGUILayout.Slider(float val,float left,float right);//一个左右拉动的条，类似于改变透明度的条子
		static int    	EditorGUILayout.IntSlider(int val,int left,int right);
		static void		EditorGUILayout.MinMaxSlider(ref float min,ref float max,float minLimit,float maxLimit);//绘制一个条子，左右两端分别为 minLimit 和 maxLimit
																											//条子里有被选中区域，左右两端分别为 min 和 max 

		//选择器
		static int 		EditorGUILayout.Popup(int selectIndex,string[] options);//返回索引
		static int 		EditorGUILayout.IntPopup(int selection,string[] options,int[] optionsValue);//返回的值是 options 的索引在 optionsValue 里的对应值而不是索引
		static System.enum EditorGUILayout.EnumPopup(System.enum en);//枚举选择器
		static string  	EditorGUILayout.TagField(string);//tag 标签选择器
		static int 		EditorGUILayout.LayerField(int);//层选择器，返回的是层而不是索引
		static Object 	EditorGUILayout.ObjectField(string label,Object obj,System.Type objType,bool allowSceneOnjects);//选择对象。返回的类型实际上是 objType 指定的类型。 label 可以不加
		static bool 	EditorGUILayout.InspectorTitleba(bool foldout,Object target);//显示 target (组件) 的。。。开头？具体内容需要自己画。

		//布尔选择器
		static bool 	EditorGUILayout.Toggle(string label,bool value);//单选框， label 可以不加
		static bool 	EditorGUILayout.Foldout(bool foldout,string content);//折叠器，返回此时是否是折叠状态。被折叠的控件可以根据返回值来判断是否折叠

		//分组排版
		static bool 	EditorGUILayout.BeginToggleGroup("string label,bool toggle);//开始 Toggle 分组。相当于用一个 Toggle 控制被分组的部分是否可用
		static void 	EditorGUILayout.EndToggleGroup();//结束 Toggle 分组。和上一个 BeginToggleGroup 方法之间代码画出来的所有控件被归为一组
		static Rect		EditorGUILayout.BeginHorizontal();//开始横向排列控件  返回这一行左上角的坐标 X Y 以及这一行的宽高 width height
		static void		EditorGUILayout.EndHorizontal();
		static Rect		EditorGUILayout.BeginVertical();//开始纵向排列控件
		static void 	EditorGUILayout.EndVertical();
		static Vector2  EditorGUILayout.BeginScrollView(Vector2);//开始滚动区域。为之间的控件添加横向和纵向的滚动条，显示不全的时候会出现
		static void 	EditorGUILayout.EndScrollView();
	#endregion

	using UnityEngine;
	//右键菜单
	[ContextMenu(string menuName,bool isValidateFunction,int priority)]//为组件添加右键菜单按钮，与MenuItem中使用CONTEXT效果一样，不过这个可以在这个被右击的脚本的内部使用
																	   //名称直接写按钮名，修饰动态方法
	[ContextMenuItem(string menuName,string function)]//同上，修饰字段.第二个参数为点击按钮时执行方法名，动态方法

	Object MenuItem.context //被右击的物体组件
	static GameObject Selection.activeGameObject;//返回Hierarchy面板和Project面板中选中的物体(属性面板中显示的游戏物体)的引用。如果一次在Hierarchy中选择多个物体，则返回最先被点击的那个
	static GameObject Selection.activeTransform;//同上，返回游戏物体的Transform组件，但不会输出project中预制体的Transform
	static UnityEngine.Object[] Selection.objects;//返回Hierarchy面板和Project面板中选中的物体的引用数组
	static GameObject[] Selection.gameObjects;//同上

	#region EditorUtility 进度条
		static void EditorUtility.DisplayProgressBar(string title, string info, float progress);//progress进度<=1
		static void EditorUtility.ClearProgressBar();//关闭进度条
	#endregion

	#region 属性面板
		//属性面板 属性相关
		[HideInInspector]//单纯的隐藏属性 在属性面板中修改的数据被保存
		[System.NonSerialized]//不序列化属性, 会被隐藏，但是在属性面板中修改的数据不会被保存
		[System.Serializable]//关键字序列化， 修饰自定义的类，该类不需要继承 MonoBehavior 使得原组件当中该类的对象被显示在 属性面板 中
		[SerializeField]//序列化域,强制显示私有字段

		/********************** *扩展组件面板* *********************** */
		/* 自定义面板 */
		//<1>在 Editor 文件夹下创建一个继承于 UnityEditor.Editor 的类
		//<2>用以下特性来修饰该类
		[CustomEditor(typeof(MyClass))]//MyClass 为被扩展的组件的类名
		//<3>实现下面的方法
		public SerializedObject mObject;//被序列化的对象
		public SerializedProperty mProp;//被序列化的属性
		public void OnEnable()//当前游戏对象被选择的时候调用
		{
			this.mObject = new SerializedObject(target);//直接写 target ，父类的属性，指代被扩展的组件的对象
			this.mProp = this.mObject.FindProperty(string);//传入被扩展组件的对象的类中属性名
		}
		public override void OnInspectorGUI()//决定组件面板应该怎么绘制面板
		{
			this.mObject.Update();//更新对象

			base.DrawDefaultInspector();//绘制默认的东西

			EditorGUILayout.PropertyField(SerializedProperty property);//绘制属性
			EditorGUILayout.PropertyField(SerializedProperty property,bool includeChildren,params GUILayoutOption[] options);//includeChildren 是否显示该对象内部的对象

			this.mObject.ApplyModifiedProperties();//更改数据
		}
		/* 自定义字段 */
		//<1>在 Editor 文件夹下创建一个继承于 UnityEditor.Editor 的类
		//<2>[CustomEditor(typeof(MyClass))] 修饰
		//<3>实现方法
		public void OnEnable()//当前游戏对象被选择的时候调用
		{
			this.mObject = new SerializedObject(target);//直接写 target ，父类的属性，指代被扩展的组件的对象
			this.mProp = this.mObject.FindProperty(string);//传入被扩展组件的对象的类中属性名
		}
		public override void OnInspectorGUI()//决定组件面板应该怎么绘制面板
		{
			this.mObject.Update();
			EditorGUILayout.PropertyField(this.mEnum);
			switch (this.mEnum.enumValueIndex)
			{
				case 0:
					EditorGUILayout.PropertyField(this.mInt);break;
				case 1:
					EditorGUILayout.PropertyField(this.mFloat);break;
			}//根据枚举值的不同而绘制不同的属性
			this.mObject.ApplyModifiedProperties();
		}
	#endregion
#endregion

#region Undo 可撤销
	static void Undo.DestroyObjectImmediate(GameObject);//可撤销的删除
	static void Undo.RecordObject(UnityEngine.Object,string);//开始对对某物体所做的更改进行记录，string传入记录到历史中的名称。
	static void Undo.RegisterCreatedObjectUndo(gameObject,string);//往历史当中注册游戏物体创建的操作
#endregion

#region	特性
	[RequireComponent(typeof(ClassName))]//修饰类型，指定本类依赖的类，会检查挂载被修饰类的物体上有无相应的类，如果没有就添加
#endregion

#region	AssetDatabase
	static string AssetDatabase.GenerateUniqueAssetDatabase(string path);//给路径指定的文件创建一个独一无二的名字，相对路径精确到文件扩展名，如"Assets/MyTextures/hello.png".
	static void AssetDatabase.CreateAsset(Object obj,string path);//把为obj创建一个文件
#endregion

#region 粒子系统 Particle System
	#region 属性面板
		Emission;//发射模块
		Shape;//形状模块
		VelocityoverLifetime;//生命周期速度模块
		limitVelocityoverLifetime;//生命周期速度限制模块
		ForceoverLifetime;//生命周期作用力模块，给粒子某方向的作用力
		ColoroverLifetime;//生命周期颜色模块
		ColorBySpeed;//颜色速度模块，让每个粒子依照其自身速度的变化而变化
	#endregion

#endregion

#region 接收键盘输入
	private void OnGUI()
	{
		if (Input.anyKeyDown)
		{
			Event e = Event.current;
			if (e.isKey && e.keyCode != KeyCode.None)
			{
				//TODO.
			}
		}
	}
#endregion

#region Event
	static Vector2 Event.current,mousePosition;//鼠标位置
#endregion

#region ScriptableObject

#endregion

##region 渲染和顶点
	static Vector3 Transform.InverseTransformPoint(Vector3 v);//把参数点从世界空间转换成模型空间

	MeshFilter();//重要组件
	MeshRenderer();//渲染组件
	Mesh();//网格组件

	Mesh MeshFilter.mesh;
	Vector3[] Mesh.vertices;//获取网格的顶点数据
	int[] Mesh.triangles;//三角形的索引

	Material MeshRenderer.material;
	Color Material.color;
	Shader Material.shader;//渲染材质的 Unity Shader

	static Shader Shader.Find(string path);//获取 Unity 内置的着色器。参数可以填入类似于 "Sprites/Default"
	
#endregion

#region 屏幕后渲染
	void OnRenderImage(RenderTexture src,RenderTexture dest);	//负责做屏幕后处理的事件
	class RenderTexture:Texture{}
	int RenderTexture.width;//渲染图片的宽度，同理还有长度属性
	FilterMode RenderTexture.filterMode;//纹理过滤模式。 FilterMode.Point/Bilinear/Trilinear
	static RenderTexture RenderTexture.GetTemporary(int width,int height,int deepthBuffer);//创建一个临时渲染用的图片。第三个参数可以写0
	static void RenderTexture.ReleaseTemporary(RenderTexture temp);//释放临时渲染用的图象
	static RenderTexture RenderTexture.active;//当前渲染的图象

	/*
	通过一个材质对传入的原图进行再渲染，然后第二个参数会被填入再渲染之后的图片
	配合 OnRenderImage() 使用 
	src 通常为当前屏幕的渲染纹理，会被传到相应 shadr 的 _MainTex 里去
	dest 输出的图象，如果为null，则会把结果直接输出到屏幕上
	pass 使用哪个 shader pass 。-1时表示依次使用， 不然只会使用索引对应的 shader pass
	*/
	static void Graphics.Blit(Texture src,RenderTexture dest,Material material,int pass = -1);
	static void Graphics.Blit(Texture src,Material mat,int pass = -1);
	static void Graphics.Blit(Texture src,RenderTexture destt);

	Material(Shader shader);
	void Material.SetFloat(string name,float val);	//往材质里对应属性传入参数（浮点数）

	bool Shader.isSupported;

	static bool SystemInfo.supportsImageEffects;
	static bool SystemInfo.supportsRenderTextures;

	/*
		亮度调整：
			最终色彩 color = oldColor*亮度偏移量;
		饱和度调整：
			色彩明亮度 l = 0.2125*r + 0.7154*g + 0.0721*b；
			饱和度为0的颜色值 lc = fixed3(l,l,l);
			最终颜色 color = lerp(lc,oldColor,饱和度偏移量);
		对比度调整：
			创建对比度为0的颜色值 avgC = fixed3(0.5,0.5,0.5);
			最终颜色 color = lerp(avgC,oldColor,对比度偏移量);
	 */
#endregion

##region Texture2D
	Texture2D(int width,int height,TextureFormat fromat,bool mipmap);//最后一个参数表示是否是纹理贴图
	void Texture2D.ReadPixels(Rect source,int destX,int destY);//从 RenderTexture.active 中读取 Rect 内的像素点，从 (destX, destY) 点开始写入
	byte[] Texture2D.EncodeToPNG();//根据 png 格式编码
	/*	截图例子
		RenderTexture.active = TargetTexture;

		Texture2D png = new Texture2D(RenderTexture.active.width, RenderTexture.active.height, TextureFormat.ARGB32, true);
		png.ReadPixels(new Rect(0, 0, RenderTexture.active.width, RenderTexture.active.height), 0, 0);

		byte[] bytes = png.EncodeToPNG();
		string path = string.Format(@"D:\123.png");
		FileStream file = File.Open(path, FileMode.Create);
		BinaryWriter writer = new BinaryWriter(file);
		writer.Write(bytes);
		file.Close();
		writer.Close();

		Destroy(png);
		png = null;
	*/

#endregion

#region AnimationCurve
	
#endregion

#region Cursor 光标相关
	static CursorLockMode Cursor.lockState;//光标锁定状态
	static bool Cursor.visible;//光标可见否
#endregion

##region AssetBundles
	BuildPipeline.BuildAssetBundles(string 输出路径,BuildAssetBundleOptions 选项,BuildTarget 目标平台);	//打包所有资源
																										//第一个参数是输出路径，如果路径不存在就会报错，用的时候需要先判断路径是否窜在。第二个参数可以用 none
	BuildAssetBundleOptions.none;//使用LZMA算法(包小，加载慢)压缩，整体解压，解压之后用LZ4重新压缩，可以部分解压保存本地
						   .UncompressedAssetBundle;//不压缩，包大，加载快
						   .ChunkBasedCompression;//LZ4，包更大，但是加载快

	static AssetBundle AssetBundle.LoadFromFile(string name);//加载资源并创建对象
	static AssetBundleCreateRequest AssetBundle.LoadFromMemoryAsync(byte[] buffer);//异步加载，配合 yield return 等待加载完成
	AssetBundle AssetBundleCreateRequest.assetBundle;//获取异步加载得到的 assetBundle
	static AssetBundle AssetBundle.LoadFromMemory(byte[] byte);//同步加载
	static UnityWebRequest UnityWebRequest.GetAssetBundle(string uri);//从主机上获取资源，uri 网络上的话用 http:///路径 本地用 file:///路径
	UnityWebRequestAsyncOperation UnityWebRequest.SendWebRequest();//向服务器端发送请求，获取资源。配合 yield return 使用
	static AssetBundle DownloadHandlerAssetBundle.GetContent(UnityWebRequest request);//下载内容
	T AssetBundle.LoadAsset<T>(string name);//从AssetBundle对象里加载资源

	/*
		打包的时候输出文件夹里会有一个和文件夹名字一样的 ab包 ,
		加载这个 ab包 并获取他的 manifest文件 可以获取到这个文件夹下的某个 ab包 的依赖项
	*/
	/*manifest文件
		CRC 完整性校验用的
		Assets 这个包里包含了哪些资源
		Dependencies 这个包依赖了哪些包
	 */
	AssetBundleManifest manifest = AssetBundle.LoadFromFile(@"AssetBundles/AssetBundles")//AssetBundles是我的输出文件夹，第二个
											.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//这个名称是固定的
	string[] AssetBundleManifest.GetAllDependencies(string name);//获取所有依赖，返回的是依赖项的文件名，不是路径
	string[] AssetBundleManifest.GetDirectDependencies(string name);//获取直接依赖，返回的是依赖项的文件名，不是路径

	void AssetBundle.Unload(bool isAll);//卸载资源，传入true表示所有资源都卸载，即使资源还在被使用，false则被引用的资源不会被卸载
	void Resources.UnloadUnusedAssets();//卸载资源
#endregion

#region DoTween
	using DG.Tweening;
	/*
		DOTween 里很多都是扩展方法
	 */

	Tweener Transform.DOMove(Vector3 endVector,float duration,bool snapping = false);//世界坐标下 将物体移动到 endVector 位置上，用时 duration 秒，第三个参数表示是否离散的移动
	Tweener Transform.DOLocalMove(Vector3 endVector,float duration,bool snapping = false);
	Tweener Transform.DORotate(Vector3 endVector,float duration,RoatetMode mode);//世界坐标系，具体可以在 mode 里面更改
	Tweener Transform.DOLocalRotate(Vector3 endVector,float duration,RoatetMode mode);
	Tweener Transform.DOPunchPosition(Vector3 punch,float duration,float vibrato = 10,float elasticity = 1,bool snapping = false);
	/*类似于弹簧或者弹珠弹跳的效果
		第一个参数表示震动的最大的偏移量
		第二个参数表示持续的时间
		第三个参数表示震动的次数
		第四个参数表示反向移动的时候距离的因子，也就是回来的时候向后压缩 punch*elasticity 的距离
		第四个参数表示是否离散
	 */
	Tweener Transform.DOPunchRotate(Vector3 punch,float duration,float vibrate = 10,float elasticity = 1,bool snapping = false);
	Tweener Transform.DOPunchScale(Vector3 punch,float duration,float vibrate = 10,float elasticity = 1,bool snapping = false);
	Tweener Transform.DOShakePosition(float duration,float strangth=1,float vibrato=10,float randomness=90f,bool snapping=false,float fadeout=true);
	/*多方向的震动效果
		第一个参数表示持续时间
		第二个参数表示震荡强度，也就是振幅
		第三个参数表示震动次数
		第四个参数表示随机性
		第五个参数表示是否离散
		第六个参数表示是否淡出
	 */
	Tweener Transform.DOShakeRotate(float duration,float strangth=1,float vibrato=10,float randomness=90f,bool snapping=false,float fadeout=true);
	Tweener Transform.DOShakeScale(float duration,float strangth=1,float vibrato=10,float randomness=90f,bool snapping=false,float fadeout=true);
	Tweener Transform.DOBlendableMoveBy(Vector3 endVector,float duration,bool snapping = false);//混合动画，在之前动画的基础上混合上一个动画，这个是增量动画
	Tweener Transform.DOBlendableRotate(Vector3 endVector,float duration,RoatetMode mode);
	
	Tweener Material.DOColor(Color toColor,float duation);//改变颜色 本质是修改 Shader 里面 _Color  的值，而不是所有 Shader 都有 _Color 属性，这点要注意
	Tweener Material.DOColor(Color toColor,string property,float duation);//第二个参数表示 shader 中被改变的颜色的属性名，一般为 _Color
	Tweener Material.DOFade(float endValue,float duation);//改变隐藏，实际就是改变 阿尔法值
	Tweener Material.DOFade(float endValue,string property,float duation);
	Tweener Material.DOGradientColor(Graidient graidient,float duration);//根据渐变改变值，只改变颜色，不改变阿尔法值 Graidient 是Unity自带的渐变编辑器，是一个类
	Tweener Material.DOVector(Vector4 v4,string property,float duration);//改变 shader 中某个四维向量(float4 等)的值，注意，在 Shader 中颜色也是四维向量

	Tweener Camera.DOAspect(float endValue,float duration);//改变相机宽:高比，高度不变，相应的，投影到屏幕上的图像会被扭曲
	Tweener Camera.DOColor(Color endValue,float duration);//改变背景颜色
	Tweener Camera.DOFarClipPlane(float endValue,float duration);//改变远截面的值
	Tweener Camera.DONearClipPlane(float endValue,float duration);//改变近截面的值
	Tweener Camera.DOFieldOfView(float endValue,float duration);//改变 FieldOfView(透视相机下)或者 Size(正交相机下)，由此可以实现方法/缩小效果
	Tweener Camera.DOPixelRect(Rect endValue,float duration);//改变相机的显示区域
	Tweener Camera.DORect(Rect endValue,float duration);//改变相机的显示区域，传入的rect的各分量用[0,1]范围的float表示
	Tweener Camera.DOShakePosition(float duration,float strangth=1,float vibrato=10,float randomness=90f,float fadeout=true);

	Tweener Text.DOText(string text,float duration,bool richTextEnable = true,ScrambleMode mode = ScrambleMode.All,string scrambleChars);
	/*打字机效果
		第三个参数表示富文本使能端
		第四个参数表示干扰的模式
		第五个参数表示干扰字符串，乱打就可以
	*/

	//队列
	static Sequence DOTween.Sequence();//创建一个对了
	Sequence Sequence.Append(Tween tween);
	Sequence Sequence.Join(Tween tween);//插入一个其他类型的动画，使之和上一个 Append 的动画同时开始执行
	Sequence Sequence.AppendInterval(float delay);//等待延时
	Sequence Sequence.Insert(float tPosition,Tween tween);//在时间线上的某个位置插入一个动画，会覆盖掉这个时间点上的其他同类型的动画
	Sequence Sequence.Prepend(Tween tween);//在队列顶部插入
	Sequence Sequence.PrependInterval(float delay);//在队里顶部插入延时
	delegate void TweenCallback();
	Sequence Sequence.AppendCallback(TweenCallback callback);//追加回调函数
	Sequence Sequence.InsertCallback(float duration,TweenCallback callback);//插入回调函数
	Sequence Sequence.PrependCallback(TweenCallback callback);
	
	//参数设置
	class Tweener : Tween{}
	Tweener Tweener.SetLoops(int loops,LoopType loopType);//设置循环次数，参数一如果设置成-1，则表示无限循环
	Tweener Tweener.From(bool isRelative = false);//把设置动画的时候传入的目标值当作起点，把原先的起点当初终点来用，相当于反向。 参数表示是不是相对运动（增量运动）
	Tweener Tweener.SetDelay(float duration);
	Tweener Tweener.SetSpeedBased(float isSpeedBase);//设置是否是时间基准，如果是true，则之前 如 DOMove(Vector3.One,2) 中的 2 表示的不是耗时而是速度
	Tweener Tweener.SetId(object id);//设置完动画之后，会被缓存在后台，通过设置ID使得我们可以索引这些缓存而不需要再次计算. ID不推荐使用会被装拆箱的对象，建议使用字符串
	Tweener Tweener.SetRecyclable(bool isRecyclable);//是否可回收
	Tweener Tweener.SetRelative(bool isRelative);//是否是增量运动
	Tweener Tweener.SetEase(Ease ease);//设置曲线类型 ease 可以设置成 Linear  具体曲线见 http://robertpenner.com/easing/easing_demo.html
	Tweener Tweener.SetEase(AnimalCurve curve);//可以用unity自定义的曲线编辑器设置曲线
	Tweener Tweener.SetEase(EaseFunction func);//根据自定义的函数来控制曲线
	delegate float EaseFunction(float time, float duration, float overshootOrAmplitude, float period);
	/*
		返回值 运行总路程的百分比 0，1
		参数一为当前时间
		第二个参数为持续时间

	 */
	Tweener Tweener.DORewind();//返回初始点，一瞬间
	Tweener Tweener.DOSmoothRewind();//返回初始点，平滑地
	Tweener Tweener.DOKill();//杀死动画
	Tweener Tweener.DOFlip();//反转补间动画
	Tweener Tweener.DOGoto(float t,bool isPlay);//跳转到时间点，以及是否播放
	Tweener Tweener.DOPlayBackwards();//倒放
	Tweener Tweener.DOPlayForwards();//正放
	Tweener Tweener.DOTogglePause();//toggle 暂停/播放
	int Tweener.CompletedLoops();//返回已经完成的循环的次数
	float Tweener.Delay();//获取在 SetDelay 中设置的延时时间
	float Tweener.Duration(bool isIncludeLoop = true);//获取持续时间，不包括 SetDelay 里设置的延时
	float Tweener.Elapsed(bool isIncludeLoop = true);//已经播放的时间
	float Tweener.ElapsedDirectionalPercentage();//当前占总过程的百分比 0,1 当 yoyo 循环的时候，值会在0和1之间来回变化
	float Tweener.ElapsedPercentage(bool isIncludeLoop = true);//真正的当前占总过程的百分比 0,1
	YieldInstruction Tweener.WaitForCompletion();//等待完成，配合协程使用，把返回值 yield return 就可以
	YieldInstruction Tweener.WaitForKill();
	YieldInstruction Tweener.WaitForRewind();
	YieldInstruction Tweeenr.WaitForStart();
	CustonYieldInstruction Tweeenr.WaitForElapsedLoops(float elapsedLoops);//等待循环次数
	CustonYieldInstruction Tweener.WaitForPosition(float position);//等待时间点
	TweenerCore<Vector3, Path, PathOptions> DOPath(Vector3[] path, float duration, PathType pathType = PathType.Linear, PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null);
	/*生成路径，并沿着路径点走
		第一个参数表示生成路径所需要的位置采样点
		第二个参数表示持续时间
		第三个参数表示路径的类型，也就是连接采样点的线是直线还是曲线之类
		第四个参数主要影响 LookAt
		第五个参数表示采样点之间生成的路径的分斌率，分辨率越高路径越平滑，但是资源消耗越大
		第六个参数表示在 Scene 窗口看到的路径的颜色，不会显示在 game 窗口当中
	 */
	TweenerCore<Vector3, Path, PathOptions> TweenerCore<Vector3, Path, PathOptions>.SetOptins(bool isClose,AxisConstraint lockPosition = AxisConstraint.none,AxisConstraint lockRotate = AxisConstraint.none);
	/*设置所生成的路径的参数
		第一个参数表示是否闭合
		第二个参数表示锁定位置，如果锁定X，则只会在路径在初始点的X方向上的投影上运动
		第二个参数表示锁定旋转
	 */
	TweenerCore<Vector3, Path, PathOptions> TweenerCore<Vector3, Path, PathOptions>.SetLookAt(float lookAhead,Vector3 forwordDirection = null,Vector3 up = null);
	/*
		第一个参数表示向前看，取值 [0,1) 不能取1
			闭环时， 取0：看向路径的切线方向
					取0.5f：看向曲率圆心
					取1：看向路径的切线的反方向
			开环时，起始与闭环的时候一样，但是会在移动过程中慢慢转向前进方向
		第二个参数
		第三个参数
	 */
	TweenerCore<Vector3, Path, PathOptions> TweenerCore<Vector3, Path, PathOptions>.SetLookAt(Vector3 lookPosition,Vector3 forwordDirection = null,Vector3 up = null);
	TweenerCore<Vector3, Path, PathOptions> TweenerCore<Vector3, Path, PathOptions>.SetLookAt(Transform lookTransform,Vector3 forwordDirection = null,Vector3 up = null);

	Tweener Tweener.OnComplete(TweenCallback callback);//动画完成时的回调
	Tweener Tweener.OnStart(TweenCallback callback);
	Tweener Tweener.OnPause(TweenCallback callback);
	Tweener Tweener.OnPlay(TweenCallback callback);
	Tweener Tweener.OnStepComplete(TweenCallback callback);
	Tweener Tweener.OnUpdate(TweenCallback callback);//DOTeen 内部的帧函数
	Tweener Tweener.OnRewind(TweenCallback callback);//重新播放的时候，包括 restart rewind doflip dobackwards

	float Tweener.fullPosition;//动画播放当前时间

	static int DOTween.Play(object targetOrId);//通过id执行缓存过的动画
	static int DOTween.Play(object target,object id);
	static List<Tween> DOTween.PausedTweens(List<Tween> fillableList = null);//返回暂停中的Tween 如果没有返回 null 而不是空列表
	static List<Tween> DOTween.PlayingTweens(List<Tween> fillableList = null);//返回播放中的Tween 如果没有返回 null 而不是空列表
	static List<Tween> DOTween.TweensById(object id,bool isPlayingOnly = false,List<Tween> fillableList);//如果没有返回 null 而不是空列表
	static List<Tween> DOTween.TweensByTarget(object target,bool isPlayingOnly = false,List<Tween> fillableList);//如果没有返回 null 而不是空列表
	static bool DOTween.IsTweening(object targetOrId,bool alsoCheckIdIsPlaying = false);//检查目标tween是否在运行，第二个参数如果是false，那么只要没有被kill就返回true，为true则只有在playing的时候在返回true
	static int DOTween.TotalPlayingTweens();//返回当前Tween的总数







#endregion










